﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dacli.modelos.dao
{
    public class PedidosDAO : EntidadDao
    {
        public modelos.Pedidos pedidos;
        public Pedidos asignarId(long id)
        {
            this.consultar("id=" + id);
            return this.pedidos;
        }

        public PedidosDAO()
            : base("pedidos")
        {

        }

        public long facturar()
        {
            FacturaDAO facturaDao = new FacturaDAO();
            facturaDao.factura= new Factura();
            facturaDao.factura.numero = facturaDao.getMaxFactura();
            facturaDao.incluir();
            pedidos.factura = facturaDao.factura;
            string sql = "UPDATE " + this.tabla + " SET facturas_id = " + pedidos.factura.id + " WHERE id = " + pedidos.id;
            return conexion.ejecutar(sql);
        }

        public long anular()
        {
            string sql = "UPDATE " + this.tabla + " SET pedido_estado_id = " + PedidoEstado.ANULADO 
                       + " WHERE id = " + pedidos.id;
            this.pedidos.estado.id = PedidoEstado.ANULADO;
            this.pedidos.estado.nombre = "Anulado";
            return conexion.ejecutar(sql);
        }

        public override long incluir()
        {

            pedidos.pacienteDiario = this.getSiguientePaciente();
            int siguientePedido = this.getSiguientePedido();             
            //Sql.Data.SqlClient.MySqlTransaction transaccion = null;
            
            try
            {
                conexion.conectar();                
              //  transaccion = conexion.conexion.BeginTransaction();
                string sql = "INSERT INTO " + this.tabla + " (iden_id, clientes_id, paciente_id, pedido_estado_id,hora, fecha, numero_paciente_diario, observacion, recargo, descuento,subtotal, iva, tipo_pago_id, nota, numero_pedido) values" +
                "('" + pedidos.iden.id + "','" + pedidos.cliente.id + "','" + pedidos.paciente.id + "','" + pedidos.estado.id + "',getDate(), getDate(),'" + pedidos.pacienteDiario + "','" + pedidos.observacion + "','" + pedidos.recargo + "','" + pedidos.descuento + "','" + pedidos.subtotal + "','" + pedidos.iva + "','" + pedidos.tiposPago.id + "','" + pedidos.nota + "','" + siguientePedido + "')";
                long pedidorResult = conexion.ejecutar(sql);
                if (pedidorResult == -1) new NotSupportedException();
                pedidos.id = pedidorResult;
                foreach (PedidoDetalle detalle in pedidos.listaPedidoDetalle)
                {
                    PedidoDetalleDAO pedidoDetalle = new PedidoDetalleDAO(pedidos);
                    pedidoDetalle.pedidoDetalle = detalle;
                    pedidoDetalle.incluir(conexion);
                }
              //  transaccion.Commit();
            }
            catch (Exception e)
            {
                //transaccion.Rollback();
                Console.Write(e.Message);
            }
            return pedidos.id;
        }
        public int getSiguientePaciente()
        {
            string sql = "SELECT isnull(MAX(numero_paciente_diario),0) FROM pedidos WHERE fecha = getDate()";

            int numPedido = 1;
            System.Data.SqlClient.SqlDataReader reader = conexion.consultar(sql);
            if (reader.Read())
            {
                var a = reader.GetValue(0);
                if (a.ToString() != "")
                    numPedido = reader.GetInt32(0) + 1;
            }
            return numPedido;
        }

        public int getSiguientePedido()
        {
            string sql = "SELECT isnull(MAX(numero_pedido),0) FROM pedidos";
            
            int numPedido = modelos.clases.Configuraciones.pedidoInicial;
            System.Data.SqlClient.SqlDataReader reader = conexion.consultar(sql);
            if (reader.Read())
            {
                numPedido = reader.GetInt32(0) + 1;
            }
            return numPedido;
        }

        public override long modificar()
        {
            throw new NotImplementedException();
        }

        public override long eliminar()
        {
            throw new NotImplementedException();
        }

        public override bool consultar(string filtro)
        {
            string sql = "SELECT * FROM " + this.tabla + " WHERE " + filtro;
            System.Data.SqlClient.SqlDataReader reader = conexion.consultar(sql);
            if (reader.Read())
            {
                PacientesDAO pacientesDao = new PacientesDAO();
                pacientesDao.consultar("id="+ reader.GetInt32(reader.GetOrdinal("paciente_id")));

                ClientesDAO clientesDao = new ClientesDAO();
                clientesDao.consultar("id="+ reader.GetInt32(reader.GetOrdinal("clientes_id")));

                IdenDAO idenDAO = new IdenDAO();
                idenDAO.consultar("id=" + reader.GetInt32(reader.GetOrdinal("iden_id")));
                
                PedidoEstadoDAO pedidoEstadoDAO = new PedidoEstadoDAO();
                pedidoEstadoDAO.asignarId(reader.GetInt32(reader.GetOrdinal("pedido_estado_id")));

                TiposPagoDAO tiposPagosDAO = new TiposPagoDAO();
                tiposPagosDAO.asignarId(reader.GetInt32(reader.GetOrdinal("tipo_pago_id")));

                FacturaDAO facturaDAO = new FacturaDAO();
                int ordinal = reader.GetOrdinal("facturas_id");
                if (!reader.IsDBNull(ordinal))
                    facturaDAO.asignarId(reader.GetInt32(reader.GetOrdinal("facturas_id")));



                this.pedidos = new Pedidos();
               // this.pedidos.hora = DateTime.Parse(reader.GetDateTime("hora").ToString());
                this.pedidos.id = reader.GetInt32(reader.GetOrdinal("id"));
                this.pedidos.fecha = reader.GetDateTime(reader.GetOrdinal("fecha"));
                this.pedidos.observacion = reader.GetString(reader.GetOrdinal("observacion"));
                try
                {
                    this.pedidos.anulada = reader.GetBoolean(reader.GetOrdinal("anulada"));
                } catch(Exception e) { 

                }

                
                this.pedidos.recargo= reader.GetDouble(reader.GetOrdinal("recargo"));
                this.pedidos.descuento = reader.GetDouble(reader.GetOrdinal("descuento"));
                this.pedidos.subtotal = reader.GetDouble(reader.GetOrdinal("subtotal"));
                this.pedidos.nota = reader.GetString(reader.GetOrdinal("nota"));
                this.pedidos.paciente = pacientesDao.pacientes;
                this.pedidos.cliente = clientesDao.clientes;
                this.pedidos.iden =idenDAO.iden;
                this.pedidos.pacienteDiario = reader.GetInt32(reader.GetOrdinal("numero_paciente_diario"));
                this.pedidos.estado = pedidoEstadoDAO.pedidoEstado;
                this.pedidos.factura = facturaDAO.factura;
                
                this.pedidos.tiposPago = tiposPagosDAO.tiposPago;
                PedidoDetalleDAO detallesDao = new PedidoDetalleDAO(pedidos);
                this.pedidos.listaPedidoDetalle =  detallesDao.getDetalle();
                return true;
            }
            return false;
        }

        public List<int> obtenerPedidos(string filtro)
        {
            if (filtro == null)
            {
                filtro = "pedidos.id <> -1";
            }
            List<int> lista = new List<int>();
            string sql = "SELECT pedidos.id as pedidoid FROM " + this.tabla + " INNER JOIN clientes c ON c.id = pedidos.clientes_id  INNER JOIN clientes  p ON pedidos.paciente_id = p.id WHERE " + filtro + " ORDER BY pedidos.id";
            System.Data.SqlClient.SqlDataReader reader = conexion.consultar(sql);
            while (reader.Read())
            {
                lista.Add(reader.GetInt32(reader.GetOrdinal("pedidoid")));
            }            
            return lista;
        }

        public double getTotalPagos(long pedidoId)
        {
            double suma = 0; 
            string sql = "SELECT SUM(monto) FROM pagos WHERE pedidos_id = " + pedidoId;            
            int numPedido = modelos.clases.Configuraciones.pedidoInicial;
            System.Data.SqlClient.SqlDataReader reader = conexion.consultar(sql);
            if (reader.Read())
            {
                var a = reader.GetValue(0);
                if ( a.ToString() != "")
                    suma = reader.GetDouble(0);
            }
            return suma;
        }

        public void cerrar()
        {
            string sql = "UPDATE pedidos SET pedido_estado_id = 2";
            pedidos.estado.id = 2;
            pedidos.estado.nombre= "Cerrada";
            new Conexion().ejecutar(sql);
        }
    }
}
